#ifndef _IPADDR_H_
#define _IPADDR_H_

#include <stdint.h>
#include <stdbool.h>
#include "debug.h"
#include "net_err.h"

#define IPV4_ADDR_FIRST 0
#define IPV4_ADDR_SECOND 1
#define IPV4_ADDR_THIRD 2
#define IPV4_ADDR_FOURTH 3
#define BROADCAST_IPV4_ADDR 0xffffffff

typedef enum
{
    IPADDR_V4 = 4
} ip_type_t;

typedef struct _ipaddr_t
{
    ip_type_t type;
    union
    {
        uint32_t q_addr; // 指向ip地址的首地址
        uint8_t addr[IPV4_ADDR_SIZE];
    };
} ipaddr_t;

void ipaddr_set_any(ipaddr_t *ip);
net_err_t ipaddr_from_str(ipaddr_t *ip, const char *str);
void ipaddr_copy(ipaddr_t *dest, const ipaddr_t *src);
ipaddr_t *ipaddr_get_any();
bool ipaddr_is_equal(const ipaddr_t *ipaddr1, const ipaddr_t *ipaddr2);
void ipaddr_to_buf(const ipaddr_t *ipaddr, uint8_t *buf);
ipaddr_t ipaddr_from_buf(const uint8_t *buf, ip_type_t type);
ipaddr_t ipaddr_get_host(const ipaddr_t *ipaddr, const ipaddr_t *netmask);
ipaddr_t ipaddr_get_net(const ipaddr_t *ipaddr, const ipaddr_t *netmask);
bool ipaddr_is_local_broadcast(const ipaddr_t *ipaddr);
bool ipaddr_is_direct_broadcast(const ipaddr_t *ipaddr, const ipaddr_t *netmask);
bool ipaddr_is_match(const ipaddr_t *dest_ip, const ipaddr_t *src_ip, const ipaddr_t *netmask);
bool ipaddr_is_any(const ipaddr_t *ipaddr);
int ipaddr_one_cnt(const ipaddr_t *ipaddr);

#endif